package cn.jbolt.core.Interceptor;

import cn.jbolt.core.api.JBoltApiBaseController;
import cn.jbolt.core.common.enums.JBoltUserOnlineState;
import cn.jbolt.core.consts.JBoltConst;
import cn.jbolt.core.enumutil.JBoltEnum;
import cn.jbolt.core.kit.JBoltControllerKit;
import cn.jbolt.core.kit.JBoltUserKit;
import cn.jbolt.core.model.OnlineUser;
import com.jfinal.aop.Interceptor;
import com.jfinal.aop.Invocation;
import com.jfinal.core.Controller;

/**
 * 全局拦截器
 * 主要拦截所有ApiController 不管是后台管理还是小程序、APP、H5的请求接口
 * 拦截到接口请求就判断 当前用户状态是否被强退、是否锁屏、是否异端被顶等情况
 */
public class JBoltOnlineUserGlobalInterceptor implements Interceptor {

	@Override
	public void intercept(Invocation inv) {
		// 不是JBoltApiBaseController 不管他
		Controller controller = inv.getController();
		if (!(controller instanceof JBoltApiBaseController)) {
			inv.invoke();
			return;
		}
		// 如果拿不到OnlineUser 直接过
		OnlineUser onlineUser = JBoltUserKit.getOnlineUser();
		if (onlineUser == null) {
			inv.invoke();
			return;
		}
		try {
			// 拿到了就开始判断用户当前状态 正常就判断锁屏
			if (onlineUser.isOnlineOk()) {

				// 判断没有锁屏 直接过
				if (!JBoltUserKit.userScreenIsLocked()) {
					inv.invoke();
					return;
				}
				// 判断访问解锁直接过
				if (JBoltConst.UNLOCKSYSTEM_ACTION_URL.equals(inv.getActionKey())) {
					inv.invoke();
					return;
				}
				//返回锁定信息
				JBoltControllerKit.renderAdminSystemLockedInfo(controller);
				return;
			}

			int state = onlineUser.getOnlineState();
			JBoltUserOnlineState stateEnum = JBoltEnum.getEnumObjectByValue(JBoltUserOnlineState.class, state);
			switch (stateEnum) {
				case OFFLINE:// 正常离线
					JBoltControllerKit.renderAdminInterceptorNotLoginInfo(controller);
					break;
				case TERMINAL_OFFLINE:// 被顶
					JBoltControllerKit.renderAdminInterceptorTerminalOfflineInfo(controller);
					break;
				case FORCED_OFFLINE:// 强退
					JBoltControllerKit.renderAdminInterceptorForcedOfflineInfo(controller);
					break;
				default:
					JBoltControllerKit.renderAdminInterceptorNotLoginInfo(controller);
					break;
			}
		}finally {
			onlineUser.deleteKeyCache();
		}
	}
}
